package com.gexin.model.activity;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;

import java.security.MessageDigest;
import java.util.Map;
import java.util.TreeMap;

/**
 * MD5加密组件
 *
 * @author wbw
 * @version 1.0
 * @since 1.0
 */
public abstract class MD5Util {

    /**
     * MD5加密
     *
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     *
     * @throws Exception
     */
    public static byte[] encodeMD5(String data) throws Exception {

        // 执行消息摘要
        return DigestUtils.md5(data);
    }

    /**
     * MD5加密
     *
     * @param data
     *            待加密数据
     * @return byte[] 消息摘要
     *
     * @throws Exception
     */
    public static String encodeMD5Hex(String data) {
        /**
         * 生成32位md5码
         *
         * @param key
         * @return
         */
             char hexDigits[] = {
                    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
            };
            try {
                byte[] btInput = data.getBytes();
                // 获得MD5摘要算法的 MessageDigest 对象
                MessageDigest mdInst = MessageDigest.getInstance("MD5");
                // 使用指定的字节更新摘要
                mdInst.update(btInput);
                // 获得密文
                byte[] md = mdInst.digest();
                // 把密文转换成十六进制的字符串形式
                int j = md.length;
                char str[] = new char[j * 2];
                int k = 0;
                for (int i = 0; i < j; i++) {
                    byte byte0 = md[i];
                    str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                    str[k++] = hexDigits[byte0 & 0xf];
                }
                return new String(str);
            } catch (Exception e) {
                return null;
            }
    }


    /**
     * @Author : lilong
     * @Description :根据签名算法得出签名---参数按照参数名ASCII码从小到大排序（字典序）
     * @Date : 10:16 2018/5/3
     * @Param : params 参数是一个集合的map
     **/
    public static String getSign(Map<String, String> params, String Appkey) {
        Map<String, String> map = new TreeMap<>();
        map.putAll(params);
        //以key1 = value1&key2 = value2拼接参数
        StringBuilder stringBuilder = new StringBuilder();
        for (Map.Entry<String, String> s : map.entrySet()) {
            String key = s.getKey();
            String value = s.getValue();
            if (StringUtils.isBlank(value)) {//过滤空值
                continue;
            }
            //拼接
            stringBuilder.append(key).append("=").append(value).append("&");
        }
        //拼接商户秘钥
        stringBuilder.append(Appkey);
        if (!map.isEmpty()) {
            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
        }
        //根据微信支付文档要求要进行
        String md5 = MD5Util.encodeMD5Hex(stringBuilder.toString());
        return md5;
    }
}
